#!/usr/bin/Rscprit
# 2016.11.22 尝试画网络图
# 尝试用R包做网络图
library(ggnetwork)
library(network)

setwd("F:/cuffdiff/network/")

if(!require(ggnetwork)){
  install.packages("ggnetwork")
  if(!require(ggnetwork)){
    stop("ggnetwork 安装失败")
  }
}


# 作图好像只能用1~3这三个等级，所以改掉,logFc按照5和10分成三个档次
change.value <- function(input){
  if(!is.numeric(input[2])){
    input[2] <- as.numeric(as.character(input[2]))
  }
  if(input[2] >= 10){
    return(3)
  }else if(input[2] >= 5){
    return(2)
  }else{
    return(1)
  }
}

# 这个是改变lnc类型RNA的x，y轴的坐标，将两种点分开
change.lnc <- function(input){
  micro <- subset(input, V2.x == "micro")
  xofmicro <- as.numeric(micro[1,2])
  yofmicro <- as.numeric(micro[1,3])
  cat(xofmicro)
  cat(yofmicro)
  for(i in 1:nrow(input)){
    if(input[i, ncol(input)-1] == "lnc"){
      input[i,2] <- (as.numeric(as.character(input[i,2])) + xofmicro)/2
      input[i,3] <- (as.numeric(as.character(input[i,3])) + yofmicro)/2
    }
  }
  
  return(input)
}

# 读取预先处理好的三种RNA的表达量值，获取之后，需要进行各种相应的变值处理
value <- read.table("value.txt")
value[,2] <- abs(value[,2])
value <- value[value[,2] >=1, ]
value[,2] <- apply(value, 1, change.value)


y <- list.files(pattern = "^h")

# 读取文件，然后处理形成network类型变量
test <- read.table(y[1])
test1 <- table(test[,c(1,3)])
testn <- network(test1, directed = T)

# 这是从原始文件中提取出相应的性质，注释就是各种RNA到底是什么RNA的一个注释
attr <- test[,c(3,4)]
colnames(attr) <- colnames(test[,1:2])
attr <- rbind(attr, unique(test[,1:2]))

# ggnetwork函数是将网络类型变量的数据转化为可以用来作图的各种坐标值
# 然后我整合各种相应的变量和标识进去
testn <- ggnetwork(testn)
testn <- merge(testn, attr, by.x = "vertex.names", by.y = "V1")
testn <- merge(testn, value, by.x = "vertex.names", by.y = "V1")

# 改变lnc的坐标
testn <- change.lnc(testn)
# 改变相应的colnames
colnames(testn)[,(ncol(testn)-1):ncol(test)] <- c("Type", "logFC")
# 真正画图的函数
ggplot(test1, aes(x = x, y = y, xend = xend, yend = yend))+
  geom_edges(aes(linetype = Type), color = "grey50") +
  geom_nodes(aes(color = Type, size = logFC)) +
  # geom_nodetext(aes(label = vertex.names)) + 
  theme_blank()

